package com.zy.facepp.service;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.FileSystemResource;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;

import com.alibaba.fastjson.JSONObject;
import com.zy.facepp.bean.OcrCardParams;
import com.zy.facepp.constant.FaceppConstant;

/**
 * Face++ Service
 *
 * @author zhanghengchang
 * @date 2018/3/8
 */
@Service
public class FacePlusPlusCardService extends FacePlusPlusService {

    private static Logger logger = LoggerFactory.getLogger(FacePlusPlusCardService.class);

    /**
     * 身份证检测
     *
     * @param params imageUrl 身份证图片的网络地址，和fileByte，image_base64三选一上传 <br/>
     *        imageFile 本地身份证图片的二进制数据，和imageUrl，image_base64三选一上传 <br/>
     *        imageBase64 身份证图片的base64格式数据，和fileByte，imageUrl三选一上传 <br/>
     *        legality 返回身份证照片合法性检查结果，值只取“0”或“1”。“1”：返回； “0”：不返回
     * @return 身份证识别结果
     */
    public JSONObject ocrIdCard(OcrCardParams params) {
        JSONObject result = cardCommon(faceppConfig.getOcrIdCardUrl(), params);
        writeReqLog(FaceppConstant.CONST_TYPE_IDCARD, params, result);
        editResponse(FaceppConstant.CONST_TYPE_IDCARD, params, result);

        return result;
    }

    /**
     * 机动车驾驶证检测
     *
     * @param params imageUrl 驾驶证图片的网络地址，和fileByte，image_base64三选一上传 <br/>
     *        imageFile 本地驾驶证图片的二进制数据，和imageUrl，image_base64三选一上传 <br/>
     *        imageBase64 驾驶证图片的base64格式数据，和fileByte，imageUrl三选一上传 <br/>
     *        legality 返回驾驶证照片合法性检查结果，值只取“0”或“1”。“1”：返回； “0”：不返回
     * @return 机动车驾驶证识别结果
     */
    public JSONObject ocrDriverLicense(OcrCardParams params) {
        JSONObject result = cardCommon(faceppConfig.getOcrDriverLicenseUrl(), params);
        writeReqLog(FaceppConstant.CONST_TYPE_DRIVER_LICENSE, params, result);
        editResponse(FaceppConstant.CONST_TYPE_DRIVER_LICENSE, params, result);

        return result;
    }

    /**
     * 机动车行驶证检测
     *
     * @param params imageUrl 行驶证图片的网络地址，和fileByte，image_base64三选一上传 <br/>
     *        imageFile 本地行驶证图片的二进制数据，和imageUrl，image_base64三选一上传 <br/>
     *        imageBase64 行驶证图片的base64格式数据，和fileByte，imageUrl三选一上传 <br/>
     *        legality 返回行驶证照片合法性检查结果，值只取“0”或“1”。“1”：返回； “0”：不返回
     * @return 机动车行驶证识别结果
     */
    public JSONObject ocrVehicleLicense(OcrCardParams params) {
        JSONObject result = cardCommon(faceppConfig.getOcrVehicleLicenseUrl(), params);
        writeReqLog(FaceppConstant.CONST_TYPE_VEHICLE_LICENSE, params, result);
        editResponse(FaceppConstant.CONST_TYPE_VEHICLE_LICENSE, params, result);

        return result;
    }

    /**
     * 银行卡检测
     *
     * @param params imageUrl 银行卡图片的网络地址，和fileByte，image_base64三选一上传 <br/>
     *        imageFile 本地银行卡图片的二进制数据，和imageUrl，image_base64三选一上传 <br/>
     *        imageBase64 银行卡图片的base64格式数据，和fileByte，imageUrl三选一上传 <br/>
     *        legality 返回银行卡照片合法性检查结果，值只取“0”或“1”。“1”：返回； “0”：不返回
     * @return 银行卡证识别结果
     */
    public JSONObject ocrBankCard(OcrCardParams params) {
        JSONObject result = cardCommon(faceppConfig.getOcrBankCardUrl(), params);
        writeReqLog(FaceppConstant.CONST_TYPE_BANK_CARD, params, result);
        editResponse(FaceppConstant.CONST_TYPE_BANK_CARD, params, result);

        return result;
    }

    /**
     * 卡片识别通用方法
     *
     * @param apiUrl API URL
     * @param params 参数
     * @return 识别结果
     */
    private JSONObject cardCommon(String apiUrl, OcrCardParams params) {
        MultiValueMap<String, Object> mvMap = new LinkedMultiValueMap<String, Object>();
        mvMap.add(FaceppConstant.KEY_FOR_APIKEY, faceppConfig.getApiKey());
        mvMap.add(FaceppConstant.KEY_FOR_APISECRET, faceppConfig.getApiSecret());

        if (StringUtils.isNotEmpty(params.getImageUrl())) {
            mvMap.add(FaceppConstant.KEY_FOR_IMAGE_URL, params.getImageUrl());
        } else if (StringUtils.isNotEmpty(params.getImageBase64())) {
            mvMap.add(FaceppConstant.KEY_FOR_IMAGE_BASE64, params.getImageBase64());
        } else if (params.getImageFile() != null) {
            mvMap.add(FaceppConstant.KEY_FOR_FILE, new FileSystemResource(params.getImageFile()));
        }

        if (StringUtils.isNotEmpty(params.getLegality())) {
            mvMap.add(FaceppConstant.KEY_FOR_LEGALITY, params.getLegality());
        } else {
            mvMap.add(FaceppConstant.KEY_FOR_LEGALITY, FaceppConstant.CONST_LEGALITY_Y);
        }

        return postTo(apiUrl, mvMap);
    }

}
